package com.example.bbbb.beanlifecycle;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2024-02-01
 * Time: 19:51
 */
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {

    private String name;

    // 1. 构造函数
    public User() {
        System.out.println("1. 构造函数：User 的构造方法");
    }

    // 2. 依赖注入
    @Value("张三")
    public void setName(String name) {
        this.name = name;
        System.out.println("2. 依赖注入：setName 方法");
    }

    // 3.1 Aware 接口：BeanNameAware 的 setBeanName 方法
    @Override
    public void setBeanName(String name) {
        System.out.println("3.1 Aware 接口：BeanNameAware 的 setBeanName 方法");
    }

    // 3.2 Aware 接口：BeanFactoryAware 的 setBeanFactory 方法
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.2 Aware 接口：BeanFactoryAware 的 setBeanFactory 方法");
    }

    // 3.3 Aware 接口：ApplicationContextAware 的 setApplicationContext 方法
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("3.3 Aware 接口：ApplicationContextAware 的 setApplicationContext 方法");
    }

    // 5.1 初始化方法，通过 @PostConstruct 注解实现
    @PostConstruct
    public void init() {
        System.out.println("5.1 自定义的初始化方法，通过 @PostConstruct 注解实现的 init 方法");
    }

    // 5.2 初始化方法，InitializingBean 接口的 afterPropertiesSet 方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5.2 初始化方法，InitializingBean 接口的 afterPropertiesSet 方法");
    }

    // 7. 销毁方法，通过 @PreDestroy 注解实现
    @PreDestroy
    public void destroy() {
        System.out.println("7. 销毁方法，通过 @PreDestroy 注解实现的 destroy 方法");
    }


}
